package someTestExcemple.huaweiOd.container.array;

import java.util.*;
//E-100-荒岛求生
//https://blog.csdn.net/guorui_java/article/details/132112650


/**
 * 一、题目描述
 * 有一个荒岛，只有左右两个港口，只有一座桥连接这两个港口，现在有一群人需要从两个港口逃生，有的人往右逃生，有的往左逃生，如果两个人相遇，则PK，体力值大的能够打赢体力值小的，体力值相同则同归于尽，赢的人才能继续往前逃生，并较少相应地体力。
 *
 * 二、输入描述
 * 一行非0整数，用空格隔开，正数代表向右逃生，负数代表向左逃生。
 *
 * 三、输出描述
 * 最终能够逃生的人数。
 * 1、输入
 * 10 20 -20 -5 10
 * 2、输出
 * 2
 */
public class CastAway {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] array = sc.nextLine().split(" ");
        //int[] array1 = Arrays.stream(array).mapToInt(Integer::parseInt).toArray();
        Integer[] array1 = Arrays.stream(array).map(Integer::parseInt).toArray(Integer[]::new);
        //正数
        //用一个队列，遍历数组，后进的先出
        Stack<Integer> postiveStack = new Stack<>();
        //计算整个左边冲出个数
        int leftCount =0;
        for(int i=0;i<array1.length;i++) {
            if(array1[i] > 0) {
                //走右边的-入栈
                postiveStack.push(array1[i]);
            }
            //走左边
            if(array1[i]<0) {
                Integer left = array1[i];
                //如果右边栈不为空，就要进行决斗
                while(!postiveStack.isEmpty()) {
                    Integer temp = postiveStack.pop() + left;
                    if(temp > 0) {
                        //右边的大 --更新右边的值，重新入栈
                        postiveStack.push(temp);
                        break;
                    }
                    if(temp == 0) {
                        left = temp;
                        //刚好抵消
                        break;
                    }
                    //小于0 -更新最新的左值
                    left = temp;
                }
                ////左边冲破整个右边出去了，并且此时还是小于0
                if(postiveStack.isEmpty() && left <0) {

                    leftCount++;
                }
            }
        }
        //栈里面剩余元素就是能从右边出去的 再加上左边出去的就是所有生存总数
        System.out.println(postiveStack.size() + leftCount);
    }
}
